#include "OssManage.h"

using namespace std;

/*
    通过双重检查锁定，保证多线程安全和性能
*/

// 静态成员变量初始化
OssManage *OssManage::instance = nullptr; // 单例对象指针
mutex OssManage::m_mutex;                 // 用于线程安全互斥锁

// 获取单例实例
OssManage *OssManage::get_instance()
{
    // 第一次检查，如果存在，直接返回
    if (instance == nullptr)
    {
        // 先加锁，保证安全再执行
        lock_guard<mutex> lock(m_mutex);

        // 第二次检查，防止多个线程同时通过第一次检查
        // 加锁前创建多个实例
        if (instance == nullptr)
        {
            // 只有检查到为空的时候才创建
            instance = new OssManage();
        }
    }
    return instance;
}

// 销毁单例实例
void OssManage::destroy_instance()
{
    lock_guard<mutex> lock(m_mutex); // 销毁也要先加锁
    // 如果实例存在，则销毁
    if (instance != nullptr)
    {
        delete instance;
        instance = nullptr;
        // 也要释放阿里云OSS SDK相关资源
        AlibabaCloud::OSS::ShutdownSdk(); // 关闭SDK
    }
}

// 私有构造函数
OssManage::OssManage()
{
    // 初始化阿里云SDK
    AlibabaCloud::OSS::InitializeSdk();

    // 设置OSS相关资源
    string endpoint = "oss-cn-wuhan-lr.aliyuncs.com";
    string accessKeyId = "LTAI5tAVUCtj2M4KD8SGfFoj";
    string accessKeySercret = "yps7OLES5GlPkgtfS1WdvMaMjkzxqc";
    string region = "cn-wuhan";

    // 客户端配置
    AlibabaCloud::OSS::ClientConfiguration conf;

    // 创建OSS客户端对象，并使用智能指针管理
    m_client = std::make_unique<AlibabaCloud::OSS::OssClient>(endpoint, accessKeyId, accessKeySercret, conf);

    // 设置客户端所属地域
    m_client->SetRegion(region);
}

// 上传文件（本地路径）
bool OssManage::upload_object(const string &bucket, const string &object, const string &file)
{
    // 调用OSS SDK提供的putobject方法，上传本地文件
    auto outcome = m_client->PutObject(bucket, object, file);

    // 返回上传结果
    return outcome.isSuccess();
}

// 
bool OssManage::upload_object(const string &bucket, const string &object, shared_ptr<std::iostream> content)
{
    // 调用OSS SDK提供的putobject方法，上传本地文件
    auto outcome = m_client->PutObject(bucket, object, content);

    // 返回上传结果
    return outcome.isSuccess();
}